// 判断一个字符串是不是数字

#include <iostream>

bool scanUnsignedInteger(const char **str)
{
    const char *before = *str;
    while (**str >= '0' && **str <= '9')
        (*str)++;
    // 如果说没有移动str，就说明没有数字
    return *str > before;
}

bool scanInteger(const char **str)
{
    if (**str == '+' || **str == '-')
        (*str)++;
    return scanUnsignedInteger(str);
}

bool IsNumber(const char *str)
{
    if (str == nullptr)
        return false;

    // 判断整数部分
    bool numeric = scanInteger(&str);
    // 判断小数部分
    if (*str == '.')
    {
        ++str;
        numeric = scanUnsignedInteger(&str) || numeric;
    }
    // 判断指数部分
    if (*str == 'e' || *str == 'E')
    {
        ++str;
        numeric = scanInteger(&str) && numeric;
    }
    numeric = numeric && *str == '\0';

    return numeric;
}

int main()
{
    // 正确
    char *str = "3.0e-1";
    std::cout << IsNumber(str) << std::endl;
    str = ".2e-1";
    std::cout << IsNumber(str) << std::endl;
    str = "2.e-1";
    std::cout << IsNumber(str) << std::endl;

    //小数错误
    str = "2.-1e-1";
    std::cout << IsNumber(str) << std::endl;
    //指数错误
    str = "2.e-1.2";
    std::cout << IsNumber(str) << std::endl;
    //没有数据
    str = "e-1";
    std::cout << IsNumber(str) << std::endl;

    return 0;
}